package com.atguigu.gulimall.ware.listener;

import com.atguigu.common.to.OrderTo;
import com.atguigu.common.to.StockLockedTo;
import com.atguigu.gulimall.ware.service.WareSkuService;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @Author 小坏
 * @Date 2021/2/17 18:00
 * @Version 1.0
 * @program: 父工程 gulimall 万物起源之地
 */

@RabbitListener(queues = "stock.release.stock.queue")
@Service
public class StockReleaseListener {


    @Autowired
    private WareSkuService wareSkuService;

    /**
     * 1、库存自动解锁
     * 下单成功，库存锁定成功，接下来的业务调用失败，导致订单回滚。之前锁定的库存就要自动解锁。
     * 2、订单失败
     * 锁库存失败
     * <p>
     * 只要解锁库存的消息失败、一定告诉服务器解锁失败
     *
     * @param to
     * @param message
     */

    @RabbitHandler
    public void handleStockLockedRelease(StockLockedTo to, Message message, Channel channel) throws IOException {
        System.out.println ("库存的自动解锁功能");

        try {
            //当前消息是否被第二次及以后（重新）派发过来了、可以先判断一下是否处理过、但是太暴力了不用
//            Integer delay = message.getMessageProperties ().getReceivedDelay ();
            //解锁库存的方法、这里调用
            wareSkuService.unLockStock (to);
            //那个消息成了就说那个成了、false不是批量批量回复、只回复自己的
            channel.basicAck (message.getMessageProperties ().getDeliveryTag (), false);
        } catch (Exception e) {
            //有任何异常就让他归队、把当前消息返回队列
            channel.basicReject (message.getMessageProperties ().getDeliveryTag (), true);
        }


    }


    /**
     * 订单关闭准备解锁
     * @param orderTo
     * @param message
     * @param channel
     * @throws IOException
     *
     *
     * 效果：订单状态 修改为4
     *        商品库存：stock_locked锁定状态返回原来的
     *        库存工作单：lock_status 改为已解锁
     */

    @RabbitHandler
    public void handleOrderCloseRelease(OrderTo orderTo, Message message, Channel channel) throws IOException {
        System.out.println ("订单关闭准备解锁。。。。。。。。");

        try {
            //解锁订单的方法、这里调用
            wareSkuService.unLockStock (orderTo);
            //那个消息成了就说那个成了、false不是批量批量回复、只回复自己的
            channel.basicAck (message.getMessageProperties ().getDeliveryTag (), false);
        } catch (Exception e) {
            //有任何异常就让他归队、把当前消息返回队列
            channel.basicReject (message.getMessageProperties ().getDeliveryTag (), true);
        }


    }

}
